package cn.ljy.authority.service;


import cn.ljy.common.exception.model.MyWebException;
import cn.ljy.common.utils.page.Pagination;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 公共业务类
 * @param <T> 模块的实体类
 * @param <Q> 模块的实体查询类
 */
public interface BaseService<T,Q> {

    /**
     * 根据id读取对象
     *
     * @param id
     * @return
     */
    T get(@NotNull(message="传递参数不能为空") java.io.Serializable id) throws MyWebException;

    /**
     * 添加对象
     * 说明：
     *
     * @param t 部分字段必须有值，详见文档
     */
    void save(@NotNull(message="传递参数不能为null") @Valid T t);

    /**
     * 编辑对象信息
     * 说明：
     *
     * @param t 部分字段必须有值，详见文档
     */
    void update(@NotNull(message="传递参数不能为null") @Valid  T t);

    /**
     * 批量删除指定对象
     *
     * @param ids 多个对象的主键集合
     */
    void delete(@NotEmpty(message = "操作失败：请选择要移除的记录") java.io.Serializable[] ids);

    /**
     * 强制删除指定记录
     * 说明：和delete相比，这个函数意思是删除所有相关函数
     * @param ids 多个对象的主键集合
     */
    void forceDelete(@NotEmpty(message = "操作失败：请选择要移除的记录") java.io.Serializable[] ids);

    /**
     * 查询符合条件的记录个数
     * @param query 查询条件类
     * @return 记录个数
     */
    int count(Q query);


    /**
     * 查询
     *
     * @param query 查询条件类
     * @return 分页对象
     */
    List<T> findAll(Q query);

    /**
     * 分页查询
     *
     * @param page     当前页面
     * @param pageSize 每页最多显示的记录数
     * @param query    查询条件类
     * @return 分页对象
     */
    Pagination findAll(Integer page, Integer pageSize, Q query);

    /**
     * 获取教师在系统中的角色Id
     * @return id的值
     */
    Integer getTeacherRoleId();

    /**
     * 获取学生在系统中的角色Id
     * @return id的值
     */
    Integer getStudentRoleId();
}